import equation.EquationRangeChecker;
import exercise.Exercise;
import exercise.ExerciseGenerator;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, SQLException {
        // 获得ExerciseGenerator的单实例对象
        ExerciseGenerator exerciseGenerator = ExerciseGenerator.getInstance();
        // 集合对象，存放配置文件中的键值对
        Properties properties = new Properties();
        // 文件对象，读取配置文件
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Starry\\OneDrive\\Git\\AlgorithmExerciseBook\\src\\config.properties");
        // 加载文件中的所有键值对
        properties.load(fileInputStream);
        fileInputStream.close();
        String className = properties.getProperty("className"); // 配置文件中的类名
        int min = Integer.parseInt(properties.getProperty("min")); // 配置文件中的min
        int max = Integer.parseInt(properties.getProperty("max")); // 配置文件中的max
        int number = Integer.parseInt(properties.getProperty("number")); // 配置文件中的number
        // 反射获取类
        Class<?> reflectionClass = Class.forName(className);
        // 通过字节码文件对象获取类的带参构造方法
        Constructor<?> reflectionConstructor = reflectionClass.getConstructor(int.class,int.class);
        // 通过反射获取的构造方法创建对象
        EquationRangeChecker equationRangeChecker = (EquationRangeChecker) reflectionConstructor.newInstance(min,max);
        // 产生算式
        Exercise exercise = exerciseGenerator.generate(number, equationRangeChecker);
        // 获取DatabaseOperator的单实例
        DatabaseOperator databaseOperator = DatabaseOperator.getInstance();
        // 保存算式至数据库
        databaseOperator.saveExercise(exercise);
        // 显示图形化用户界面GUI，
        // GUI里会调用DatabaseOperator里的loadExercises()方法加载数据并呈现可交互的用户界面
        GUI gui = new GUI();
        gui.showGUI();
    }

}